"""
封装数据库, 制作成一个工具类, 使用的时候, 只需要传入不同的sql语句, 即可实现数据库相关操作

db_tools: 连接的ihrm数据库
"""
import pymysql


class DBTools(object):

    # 创建连接的方法, 连接的代码抽取成一个公用的方法
    def __init__(self):
        # __init__创建对象时, 会自动调用该方法
        # 可以将这个方法理解为Pytest里的 setup_class 可以在这个方法里做前置工作
        # 2. 创建连接对象
        self.conn = pymysql.connect(host="211.103.136.244", port=7061,
                                    user="student", password="iHRM_student_2021",
                                    database="ihrm", charset="utf8")
        # 3. 创建游标对象
        self.cs = self.conn.cursor()

    def __del__(self):
        # __del__对象没有人使用时, 此时会自动调用该方法
        # 可以将这个方法理解为Pytest里的 teardown_class 可以在这个方法里做收尾工作
        # 5. 关闭游标
        self.cs.close()
        # 6. 关闭连接
        self.conn.close()

    # 查一条记录
    def query_one(self, sql):
        try:
            # 4. 根据传入的sql语句查询数据
            self.cs.execute(sql)
            # 查询到的结果, 需要返回
            return self.cs.fetchone()
        except Exception as e:
            print("查询语句, 只需要记录错误即可", e)

    # 增删改记录
    def db_uid(self, sql):
        try:
            # 4. 增删改操作
            result = self.cs.execute(sql)
            print("影响的行数", result)  # 根据影响的行数, 来判断操作了几条数据
            # 代码需要实现手动提交事务
            self.conn.commit()
        except Exception as e:
            print("删除数据库错误", e)
            # 失败回滚
            self.conn.rollback()


if __name__ == '__main__':
    # 测试查询功能是否正常
    db = DBTools()
    result = db.query_one("select * from t_book;")
    print("查询结果", result)

    result = db.query_one("select * from t_hero;")
    print("查询结果", result)

    # 测试增删改功能是否正常
    db.db_uid("UPDATE t_book SET `read` = `read` + 1 WHERE id = 1;")